package ru.compft.common.security;

import org.springframework.security.access.hierarchicalroles.RoleHierarchy;
import org.springframework.security.core.GrantedAuthority;
import ru.compft.common.services.RolesService;

import javax.annotation.Resource;
import java.util.Collection;

/**
 * User: ASUS
 * Date: 10.11.12
 * Time: 1:50
 * <p/>
 * Бин строящий иерархии ролей для ролей пользователя
 * Из БД получаем все существующие роли и выстраиваем иерархическую зависимость, исходя из наследования, между ролями
 */
public class AppRoleHierarchy implements RoleHierarchy {

    @Resource(name = "roleService")
    private RolesService roleService;

    /**
     * Возвращает коллекцию всех доступных ролей для пользователя, исходя из иерархической структуры ролей.
     * Структура ролей берется из БД.
     * У роли может быть только одна родительская роль
     *
     * @param authorities - List of the directly assigned authorities.
     * @return List of all reachable authorities given the assigned authorities.
     */
    @Override
    public Collection<? extends GrantedAuthority> getReachableGrantedAuthorities(Collection<? extends GrantedAuthority> authorities) {
        return roleService.getReachableGrantedAuthorities(authorities);
    }


//    public static void main(String[] args) {
//        // иерархия для каждой роли
//        final Map<String, Set<GrantedAuthority>> hierarhyMap = new HashMap<String, Set<GrantedAuthority>>();
//
//        // получаем все роли из БД
//        final List<AppRole> appRoleList = new ArrayList<AppRole>();
//        AppRole role1 = new AppRole();
//        role1.setCode("1");
//        AppRole role2 = new AppRole();
//        role2.setCode("2");
//        AppRole role3 = new AppRole();
//        role3.setCode("3");
//        AppRole role4 = new AppRole();
//        role4.setCode("4");
//        AppRole role5 = new AppRole();
//        role5.setCode("5");
//        AppRole role6 = new AppRole();
//        role6.setCode("6");
//        AppRole role7 = new AppRole();
//        role7.setCode("7");
//
//        role7.setParent(role6);
//        role6.setParent(role5);
//        role5.setParent(role4);
//        role4.setParent(role2);
//        role3.setParent(role2);
//        role2.setParent(role1);
//
//        appRoleList.add(role4);
//        appRoleList.add(role6);
//        appRoleList.add(role1);
//        appRoleList.add(role3);
//        appRoleList.add(role2);
//        appRoleList.add(role5);
//        appRoleList.add(role7);
//
//        if (!CollectionUtils.isEmpty(appRoleList)) {
//            for (AppRole appRole : appRoleList) {
//                // выстраиваем дерево зависимостей для каждой роли
//                createHierarhicalTree(appRole, appRole.getCode(), hierarhyMap);
//            }
//        }
//
//        for (Map.Entry entry : hierarhyMap.entrySet()) {
//            System.out.println(entry.getKey() + " = " + entry.getValue());
//        }
//    }
}
